/* 无序关联容器   =》链式哈希表     增删查 O(1)
 * unordered_set
 * unordered_multiset   在unordered_set基础上允许key值重复
 * unordered_map
 * unordered_multimap
 *
 * unordered_set:[key]
 * unordered_map:[key,value]
 *
 * 常用增删查方法：
 * 增加：insert(val)
 * 遍历：iterator自己搜索，调用find成员方法
 * 删除：erase(key) erase(it)
 *
 * unordered_map的operator[]作用：
 * 1、查询
 * 2、如果key不存在，会插入一对数据[key,string()]
 *
*/
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <string>
using namespace std;
int main(){
    /*
    unordered_set<int> s1;
    for (int i = 0; i < 10; ++i) {
        s1.insert(rand()%10+1);
    }
    cout<<s1.size()<<endl;
    cout<<s1.count(5)<<endl;

    for (auto i = s1.cbegin(); i !=s1.cend() ; ++i) {
        cout<<*i<<" ";
    }
    cout<<endl;

    s1.erase(1);        //按key值删除元素

    auto it1=s1.find(7);
    if (it1!=s1.end()){
        s1.erase(it1);
    }

    for (int num:s1) {
        cout<<num<<" ";
    }
    cout<<endl;
    */

    /*
    unordered_map<int,string> m1;
    m1.insert(make_pair(1000,"wyx"));
    m1.insert({1001,"lxy"});
    m1.insert({1002,"wang"});

    m1.erase(1001);

    m1[2000]="koala";

    auto it=m1.find(1002);
    if (it!=m1.end()){
        cout<<"key: "<<it->first<<" value: "<<it->second<<endl;
    }

    cout<<m1.size()<<endl;
    cout<<m1[1000]<<endl;
    */

    //哈希表主要处理海量数据去重
    const int arry_len=100000;
    int arr[arry_len]={0};
    for (int i = 0; i < arry_len; ++i) {
        arr[i]=rand()%1000+1;
    }

    //上面的十万个整数中，统计哪些数字重复了，并且统计数字重复的次数
    unordered_map<int,int> map1;
    for (int k:arr) {
//        auto it=map1.find(k);
//        if (it==map1.end()){
//            map1.insert({k,1});
//        } else{
//            it->second++;
//        }
        map1[k]++;
    }

    for (pair<int,int> p:map1) {
        if (p.second>1){
            cout<<"key: "<<p.first<<" count: "<<p.second<<endl;
        }
    }

    return 0;
}